#pragma once 
#include "Aggregate.h"
#include "Iterator.h"
#include "Book.h"
#include <vector>
#include <climits>

class BookShelf : public Abstract::Aggregate<Book>
{
private:
    std::vector<Book> books;
    unsigned int last;
public:
    BookShelf():last(INT_MAX){};
    Book& getBookAt(unsigned int);
    void appendBook(Book);
    unsigned int getLength();
    
    //explicitly override iterator(), rather than hiding it 
    std::shared_ptr<Abstract::Iterator<Book>> iterator() override;
};
